#include "userdatabase.h"

// 构造函数：初始化数据库
UserDatabase::UserDatabase(QObject *parent) : QObject(parent)
{
    initDatabase();
}

// 析构函数：关闭数据库连接
UserDatabase::~UserDatabase()
{
    if (m_db.isOpen()) {
        m_db.close();
    }
}

// 初始化数据库：创建连接和用户表
bool UserDatabase::initDatabase()
{
    m_db = QSqlDatabase::addDatabase("QSQLITE");  // 使用SQLite数据库
    m_db.setDatabaseName("users.db");             // 数据库文件名

    // 打开数据库
    if (!m_db.open()) {
        qDebug() << "Error: connection with database failed";
        return false;
    } else {
        qDebug() << "Database: connection ok";
    }

    // 创建用户表（如果不存在）
    QSqlQuery query;
    query.exec("CREATE TABLE IF NOT EXISTS users ("
               "id INTEGER PRIMARY KEY AUTOINCREMENT, "  // 自增ID
               "username VARCHAR(255) NOT NULL UNIQUE, "  // 用户名（唯一）
               "password VARCHAR(255) NOT NULL, "         // 密码（哈希后）
               "created_at DATETIME DEFAULT CURRENT_TIMESTAMP)");  // 创建时间

    return true;
}

// 密码哈希处理：使用SHA256
QString UserDatabase::hashPassword(const QString &password)
{
    return QCryptographicHash::hash(password.toUtf8(), QCryptographicHash::Sha256).toHex();
}

// 注册用户：返回是否成功
bool UserDatabase::registerUser(const QString &username, const QString &password)
{
    // 检查用户名和密码是否为空
    if (username.isEmpty() || password.isEmpty()) {
        return false;
    }

    // 检查用户是否已存在
    if (userExists(username)) {
        return false;
    }

    // 哈希密码
    QString hashedPassword = hashPassword(password);

    // 插入新用户
    QSqlQuery query;
    query.prepare("INSERT INTO users (username, password) VALUES (:username, :password)");
    query.bindValue(":username", username);
    query.bindValue(":password", hashedPassword);

    if (query.exec()) {
        return true;
    } else {
        qDebug() << "Register error:" << query.lastError();
        return false;
    }
}

// 用户登录：验证用户名和密码
bool UserDatabase::loginUser(const QString &username, const QString &password)
{
    // 检查用户名和密码是否为空
    if (username.isEmpty() || password.isEmpty()) {
        return false;
    }

    // 哈希密码
    QString hashedPassword = hashPassword(password);

    // 查询用户
    QSqlQuery query;
    query.prepare("SELECT * FROM users WHERE username = :username AND password = :password");
    query.bindValue(":username", username);
    query.bindValue(":password", hashedPassword);

    // 执行查询并检查结果
    if (query.exec() && query.next()) {
        return true;
    } else {
        qDebug() << "Login error:" << query.lastError();
        return false;
    }
}

// 检查用户是否存在
bool UserDatabase::userExists(const QString &username)
{
    QSqlQuery query;
    query.prepare("SELECT * FROM users WHERE username = :username");
    query.bindValue(":username", username);

    // 执行查询并检查是否有结果
    if (query.exec() && query.next()) {
        return true;
    }
    return false;
}
